#装饰器

"""
需求：请实现在函数执行之前输出before，输出之后输出after
"""
"""
特殊语法：在某个函数上方使用
@函数名
def xxx:
    pass
py内部会自动执行 函数名（xxx),执行完之后，再将结果赋值给 xxx
xxx=函数名（xxx)
"""

"""def outer(org):
    def inner():
        print("before")
        result = org()
        print("after")
        return result #之所以返回值是为了确保是同一个地址处的函数
    return inner
@outer #func=outer(func)
def func():
    print("hello")
    #print(func)
    return func


#ret=outer(func)()
ret1=func()
#print(ret)
print(ret1)"""

"""给多个函数输出前后都加上before和after"""
# def outer(org):
#     def inner():
#         print("before")
#         result = org()
#         print("after")
#         return result #之所以返回值是为了确保是同一个地址处的函数
#     return inner
# @outer    #func=outer(func)
# def func1():
#     print("我是func1")
# @outer
# def func2():
#     print("我是func2")
# @outer
# def func3():
#     print("我是func3")
# func1()
# func2()
# func3()



"""注意：如果有传参"""
def outer(org):  #重点，得会自己写
    def inner(*args, **kwargs):
        print("before")
        result = org(*args, **kwargs)
        print("after")
        return result #之所以返回值是为了确保是同一个地址处的函数
    return inner
@outer    #func=outer(func)
def func1(a1):
    print("我是func1")
@outer
def func2(a1,a2):
    print("我是func2")
@outer
def func3(a1):
    print("我是func3")
func1(1)
func2(2,a2=5)
func3(3)

"""
装饰器实现原理:基于@语法和函数闭包，将原函数封装在闭包中，然后将函数赋值为一个新的函数（内置函数），执行函数时再在内层函数中执行闭包中的原函数。
实现效果：可以在不改变原函数内部代码和调用方式的前提下，实现在函数执行 和 执行扩展功能
适用场景：多个函数系统统一在一起执行前后定义的一些功能

"""


